package com.atguigu.sparkcore.ording

/**
 * CompartoDemo
 * author 剧情再美终是戏
 * mail 13286520398@163.com
 * date 2020/1/8 17:56 
 * version 1.0
 **/
object CompartoDemo {

  def main(args: Array[String]): Unit = {

    // comparto01 比较基本类型，这种基本类型scala已经提供了Ordering[Int]
    println(comparto01(3, 2))


    // comparto01 比较对象
    // 方式一：需要添加User对象的Ordering隐式值
    //    implicit val userRd = new Ordering[User] {
    //      override def compare(x: User, y: User): Int = {
    //        x.age - y.age
    //      }
    //    }

    // 方式二：extends Ordered[User] 重写override def compare(that: User): Int方法
    println(comparto01(User(19, "zhangsan"), User(15, "lisi")))

    // compartor02 比较基本值类型
    println(comparto02(3, 2))

    // compartor02 比较对象
    println(comparto02(User(19, "zhangsan"), User(21, "lisi")))
  }
  /**
   * 带隐式Ordering的比较方法
   *
   * @param t1  值1
   * @param t2  值2
   * @param ord 隐式Ordering
   * @return T 较大的值
   */
  def comparto01[T](t1: T, t2: T)(implicit ord: Ordering[T]): T = {
    if (ord.gt(t1, t2)) t1 else t2
  }

  /**
   * 通过上下文限制来比较
   *
   * @param t1 值1
   * @param t2 值2
   * @return 较大的值
   */
  def comparto02[T: Ordering](t1: T, t2: T): T = {

    // 获取Ordering隐式对象
    val ord: Ordering[T] = implicitly(Ordering[T])

    // 获取Ordering[T]对象进行比较
    if (ord.gt(t1, t2)) t1 else t2
  }

  // 定义样例类
  case class User(age: Int, name: String) extends Ordered[User] {
    override def compare(that: User): Int = that.age - this.age
  }

}
